]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
status/keyboard: Preserve MRU order while IBus is disabled
authorMaksim Mazko <undeparg@gmail.com>
Mon, 2 Mar 2026 17:44:56 +0000 (20:44 +0300)
committerFlorian Müllner <fmuellner@gnome.org>
Sat, 14 Mar 2026 11:02:46 +0000 (12:02 +0100)
In password fields, IBus sources are temporarily disabled and a backup
of the MRU list is created. If the user switches layouts in that state,
the active MRU list is updated, but the backup is not.

When IBus is enabled again, the stale backup is restored and the order
the user just selected is lost. Sync the backup on interactive source
switches while IBus is disabled, so the MRU order stays consistent.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/8538
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/4101>

js/ui/status/keyboard.js

index b1527e3c441bda1570b57c3392602dce4beed4eb..72d15e604a8280044953a06de9771ce03c87d11c 100644 (file)
@@ -484,7 +484,7 @@ export class InputSourceManager extends Signals.EventEmitter {
         this._settings.mruSources = sourcesList;
     }
 
-    _currentInputSourceChanged(newSource) {
+    _currentInputSourceChanged(newSource, interactive) {
         let oldSource;
         [oldSource, this._currentSource] = [this._currentSource, newSource];
 
@@ -495,6 +495,16 @@ export class InputSourceManager extends Signals.EventEmitter {
             ...this._mruSources.filter(s => s !== newSource),
         ];
 
+        // Only track user-initiated switches in backup MRU.
+        // Internal (non-interactive) activations during reload/reapply must not affect restore order.
+        if (interactive && this._disableIBus && this._mruSourcesBackup) {
+            this._mruSourcesBackup = [
+                newSource,
+                ...this._mruSourcesBackup.filter(
+                    s => s.type !== newSource.type || s.id !== newSource.id),
+            ];
+        }
+
         this._changePerWindowSource();
     }
 
@@ -512,7 +522,7 @@ export class InputSourceManager extends Signals.EventEmitter {
 
         this._ibusManager.setEngine(engine);
 
-        this._currentInputSourceChanged(is);
+        this._currentInputSourceChanged(is, interactive);
 
         if (interactive)
             this._updateMruSettings();